#include <iostream>
using namespace std;

template<class T>// 模版一
T add(T t1, T t2){
    cout << "模块一" << endl;
    return t1 + t2;
}

template<class  T1, class T2>// 模版二
// 对于第一中单一类型的template来说，只能使用一样的类型
// 要是存在double，int这样的情况，会出现精度丢失
// 所以使用两个类型的template就可以避免这种情况
T1 add(T1 t1,T2 t2){
    cout << "模块二" << endl;
    return t1 + t2;
}

void test(){
    double x = 1.2;
    int y = 4;
    cout << "add(double, int)"<< add(x, y) << endl;
    cout << "============" << endl;
    cout << "add(int, double)" <<  add(y, x) << endl;
    // 上面这中调用方式都是调用的模版二但是第二个调用方式
    // 它的默认的返回值会是int类型
    // 所以第一个输出的5.2第二个输出的5，还是损失了精度
}


int main(int atgc, char * argv[])
{
    test();
    return 0;
}

